csswidgetnode: Avoid creating a stylecontext
authorBenjamin Otte <otte@redhat.com>
Thu, 5 Mar 2015 05:23:35 +0000 (06:23 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 18 Mar 2015 14:23:33 +0000 (15:23 +0100)
If the widget doesn't have a style context, don't create one. Instead,
call functions on the widget directly.

gtk/gtkcsswidgetnode.c
gtk/gtkwidget.c
gtk/gtkwidgetprivate.h

index 668f6c2e4ed1669fe7fc710692a23b54709b363b..a23db5f7f80945c9eeae1215f159addce335a683 100644 (file)
@@ -22,6 +22,7 @@
 #include "gtkcontainerprivate.h"
 #include "gtkcssanimatedstyleprivate.h"
 #include "gtkprivate.h"
+#include "gtksettingsprivate.h"
 #include "gtkstylecontextprivate.h"
 #include "gtkwidgetprivate.h"
 /* widgets for special casing go here */
@@ -112,9 +113,11 @@ gtk_css_widget_node_validate (GtkCssNode *node)
   if (widget_node->widget == NULL)
     return;
 
-  context = gtk_widget_get_style_context (widget_node->widget);
-
-  gtk_style_context_validate (context, widget_node->accumulated_changes);
+  context = _gtk_widget_peek_style_context (widget_node->widget);
+  if (context)
+    gtk_style_context_validate (context, widget_node->accumulated_changes);
+  else
+    _gtk_widget_style_context_invalidated (widget_node->widget);
   _gtk_bitmask_free (widget_node->accumulated_changes);
   widget_node->accumulated_changes = _gtk_bitmask_new ();
 }
@@ -207,11 +210,19 @@ static GtkStyleProviderPrivate *
 gtk_css_widget_node_get_style_provider (GtkCssNode *node)
 {
   GtkCssWidgetNode *widget_node = GTK_CSS_WIDGET_NODE (node);
+  GtkStyleContext *context;
+  GtkStyleCascade *cascade;
 
   if (widget_node->widget == NULL)
     return NULL;
 
-  return gtk_style_context_get_style_provider (gtk_widget_get_style_context (widget_node->widget));
+  context = _gtk_widget_peek_style_context (widget_node->widget);
+  if (context)
+    return gtk_style_context_get_style_provider (context);
+
+  cascade = _gtk_settings_get_style_cascade (gtk_widget_get_settings (widget_node->widget),
+                                             gtk_widget_get_scale_factor (widget_node->widget));
+  return GTK_STYLE_PROVIDER_PRIVATE (cascade);
 }
 
 static GdkFrameClock *
index b28ebcfba7f88c85126da1555f223630fed3f44e..fc6f3ab7b33cf0a993ec0ec6140c7b714b4e9ef1 100644 (file)
@@ -16427,6 +16427,13 @@ gtk_widget_get_css_node (GtkWidget *widget)
   return widget->priv->cssnode;
 }
 
+GtkStyleContext *
+_gtk_widget_peek_style_context (GtkWidget *widget)
+{
+  return widget->priv->context;
+}
+
+
 /**
  * gtk_widget_get_style_context:
  * @widget: a #GtkWidget
index 88af50c18facc52de439bdb98a86270bbccd19c0..c463a5b906d6bd934f121bc309c7cd83a1dd83a3 100644 (file)
@@ -131,6 +131,7 @@ gpointer          _gtk_widget_peek_request_cache           (GtkWidget *widget);
 void              _gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
                                                             GtkWidget *toplevel,
                                                             gpointer   user_data);
+GtkStyleContext * _gtk_widget_peek_style_context           (GtkWidget *widget);
 GtkStyle *        _gtk_widget_get_style                    (GtkWidget *widget);
 void              _gtk_widget_set_style                    (GtkWidget *widget,
                                                             GtkStyle  *style);